<?php
require_once '../dlo/ArquivoDLO.php';
require_once '../dlo/GrupoDLO.php';
require_once '../dlo/UsuarioDLO.php';

class ArquivoController {

    private $cod_arquivo;
    private $descricao;
    private $cod_espaco;
    private $row_id;
    private $campo_id;
    private $campo_valor;
    private $tipo_listagem;

    function __construct(&$cod_arquivo, &$descricao, &$cod_espaco, &$row_id, &$campo_id, &$campo_valor, &$tipo_listagem, &$filtro) {
        $this->filtro = &$filtro;
        $this->cod_arquivo = &$cod_arquivo;
        $this->descricao = &$descricao;
        $this->cod_espaco = &$cod_espaco;
        $this->row_id = &$row_id;
        $this->campo_id = &$campo_id;
        $this->campo_valor = &$campo_valor;
        $this->tipo_listagem = &$tipo_listagem;
    }

    public function cadastrar() {
        try {
            if (!empty($_FILES)) {
                $dlo = &ArquivoDLO::getInstance();
                $arquivo = $_FILES['Filedata']['tmp_name'];

                if ($arquivo != "none") {
                    $nome = $_FILES['Filedata']['name'];

                    $fp = fopen($arquivo, "rb");

                    if (BancoDeDados::getInstance()->getSgbd() == "MYSQL") {
                        $conteudo = chunk_split(base64_encode(fread($fp, filesize($arquivo))));
                    } else {
                        $conteudo = bin2hex(fread($fp, filesize($arquivo)));
                    }

                    fclose($fp);

                    $tipo = $this->mimeType($nome);

                    $dlo->cadastrar($conteudo, $this->descricao, $this->cod_espaco, $tipo, $nome);
                } else {
                    throw new Exception("File not found!");
                }
                echo $nome;
            }
        } catch (Exception $e) {
            echo "Exception: " . $e->getMessage();

            $myFile = "teste.txt";
            $fh = fopen($myFile, 'w') or die("can't open file");
            fwrite($fh, $e->getMessage());
            fclose($fh);
        }
    }
    
    private function mimeType($name) {
        $name = strtolower($name);
        $result = "application/octet-stream";
        if(strpos($name,'png') !== false) {
            $result = "image/png";
        } elseif(strpos($name,'gif') !== false) {
            $result = "image/gif";
        } elseif(strpos($name,'jpg') !== false) {
            $result = "image/jpeg";
        } elseif(strpos($name,'pdf') !== false) {
            $result = "application/pdf";
        } elseif(strpos($name,'txt') !== false) {
            $result = "text/plain";
        } elseif(strpos($name,'doc') !== false) {
            $result = "application/msword";
        } elseif(strpos($name,'xls') !== false) {
            $result = "application/vnd.ms-excel";
        } elseif(strpos($name,'zip') !== false) {
            $result = "application/zip";
        } elseif(strpos($name,'ppt') !== false) {
            $result = "application/vnd.ms-powerpoint";
        }
        	
        return $result;
    }

    public function alterar() {
        try {
            $dlo = &ArquivoDLO::getInstance();
            $dlo->alterar($this->row_id, $this->campo_id, $this->campo_valor);
            echo $this->campo_valor;
        } catch (Exception $e) {
            if ($e->getMessage() != 'no_action') {
                echo "Exception: " . $e->getMessage();
            } else {
                echo $this->campo_valor;
            }
        }
    }

    public function excluir() {
        try {
            $dlo = &ArquivoDLO::getInstance();
            $dlo->excluir($this->cod_arquivo);
        } catch (Exception $e) {
            echo "Exception: " . $e->getMessage();
        }
    }

    public function listar() {
        try {
            $recurso = 'arquivo';
            if (UsuarioDLO::getInstance()->isLogado()) {
                $result = &GrupoDLO::getInstance()->consultarPermissao(UsuarioDLO::getInstance()->getCod_grupo(), $recurso);
            } else {
                $result['consulta'] = 'S';
                $result['alteracao'] = 'N';
                $result['exclusao'] = 'N';
                $result['inclusao'] = 'N';
            }
            if ($result['consulta'] == 'S') {
                $dlo = &ArquivoDLO::getInstance();
                $lista = &$dlo->listar($this->cod_espaco, $this->filtro);
                if ($this->tipo_listagem == 'xml') {
                    $xml = new XMLWriter();
                    $xml->openMemory();
                    $xml->startDocument('1.0', 'UTF-8');
                    $xml->startElement("lista");
                    foreach ($lista as $arquivo) {
                        $xml->startElement("arquivo");
                        $xml->writeElement('cod_arquivo', $arquivo['cod_arquivo']);
                        $xml->writeElement('descricao', $arquivo['descricao']);
                        $xml->writeElement('tipo', $arquivo['tipo']);
                        $xml->writeElement('nome', $arquivo['nome']);
                        $xml->endElement();
                    }
                    $xml->endElement();
                    header('Content-type: text/xml');
                    print $xml->outputMemory(true);
                } elseif ($this->tipo_listagem == 'json') {
                    $toPost['arquivos'] = $lista;
                    $toPost['permissoes'] = $result;
                    echo json_encode($toPost);
                }
            } else {
                throw new Exception('Sem permissão de consulta!');
            }
        } catch (Exception $e) {
            echo "Exception: " . $e->getMessage();
        }
    }

    public function consultar() {
        try {
            $recurso = 'arquivo';
            if (UsuarioDLO::getInstance()->isLogado()) {
                $result = &GrupoDLO::getInstance()->consultarPermissao(UsuarioDLO::getInstance()->getCod_grupo(), $recurso);
            } else {
                $result['consulta'] = 'S';
                $result['alteracao'] = 'N';
                $result['exclusao'] = 'N';
                $result['inclusao'] = 'N';
            }
            if ($result['consulta'] == 'S') {
                $dlo = &ArquivoDLO::getInstance();
                $result = &$dlo->consultar($this->cod_arquivo);
                
                header("Content-type: {$result['tipo']}");
                header("Content-Disposition: inline; filename=\"{$result['nome']}\"");
                
                $conteudo = base64_decode($result['conteudo']);
                
                print $conteudo;
            } else {
                throw new Exception('Sem permissão de consulta!');
            }
        } catch (Exception $e) {
            echo "Exception: " . $e->getMessage();
        }
    }

}

$cod_arquivo = $_GET['cod_arquivo'];
if (isset($_POST['cod_arquivo'])) {
    $cod_arquivo = $_POST['cod_arquivo'];
}
$cod_espaco = $_GET['cod_espaco'];
if (isset($_POST['cod_espaco'])) {
    $cod_espaco = $_POST['cod_espaco'];
}
$acao = $_GET['acao'];
if (isset($_POST['acao'])) {
    $acao = $_POST['acao'];
}
$controller = new ArquivoController($cod_arquivo, $_POST['descricao'], $cod_espaco, $_POST['row_id'], $_POST['campo_id'], $_POST['campo_valor'], $_POST['tipo_listagem'], $_POST['filtro']);
if ($acao == 'cadastrar') {
    $controller->cadastrar();
} elseif ($acao == 'alterar') {
    $controller->alterar();
} elseif ($acao == 'excluir') {
    $controller->excluir();
} elseif ($acao == 'consultar') {
    $controller->consultar();
} elseif ($acao == 'listar') {
    $controller->listar();
}
?>